using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;

namespace Entersoft.Data.DotNetResponse.SQL
{
    public class Persistence : IDisposable
    {
        private bool mTieneDatos;
        private object m_GetScalar;
        private SqlDataReader m_DataReader;
        private string m_StoredProcedure;
        private List<object> m_Parametro;

        private List<string> m_Errores;
        private List<string> m_Mensaje;

        private DataSet m_DataSet;
        private DataTable m_DataTable;

        public string StoredProcedure {
            get { return m_StoredProcedure; }
            set { m_StoredProcedure = value; }
        }

        public object GetScalar {
            get { return m_GetScalar; }
            set {
                m_GetScalar = value;
                mTieneDatos = true;
            }
        }

        public bool TieneErrores {
            get { return m_Errores != null; }
        }

        public bool TieneDatos
        {
            get { return mTieneDatos; }
            set { mTieneDatos = value; }
        }

        public string Errores {
            get
            {
                var lista = "";

                if (m_Errores != null)
                    foreach (var s in m_Errores)
                        lista = lista + s + "\n";

                return lista;
            }
        }

        public SqlDataReader GetDataReader {
            get { return m_DataReader; }
            set { m_DataReader = value; }
        }

        public int GetRecordCount
        {
            get
            {
                return m_DataTable != null ? m_DataTable.Rows.Count : 0;
            }
        }

        public DataSet DataSet
        {
            get { return m_DataSet; }
            set
            {
                try
                {
                    if (value.Tables.Count == 0)
                    {
                        AddMensaje(" Sin Informaci�n");
                        return;
                    }

                    if (value.Tables[0].Rows.Count == 0)
                    {
                        AddMensaje(" Sin Informaci�n");
                        return;
                    }
                    m_DataSet = value;
                    mTieneDatos = true;

                }
                catch (Exception ex)
                {
                    AddMensaje(ex.Message);
                    AddMensaje(" Sin Informaci�n");
                    return;
                }
            }
        }

        public DataTable DataTable
        {
            get { return m_DataTable; }
            set
            {
                try
                {
                    if (value.Rows.Count == 0)
                    {
                        AddMensaje("Sin Informaci�n");
                        return;
                    }

                    m_DataTable = value;
                    mTieneDatos = true;
                }
                catch (Exception ex)
                {
                    AddMensaje(ex.Message);
                    AddMensaje("Sin Informaci�n");
                    return;
                }
            }
        }

        public List<string> Mensaje
        {
            get { return m_Mensaje; }
        }

        public void AddParametro(object Valor)
        {
            if (m_Parametro == null)
                m_Parametro = new List<object>();

            m_Parametro.Add(Valor);
        }

        public void AddMensaje(string Valor)
        {
            if (m_Mensaje == null)
                m_Mensaje = new List<string>();

            m_Mensaje.Add(Valor);
        }

        public void AddError(string Valor)
        {
            if (m_Errores == null)
                m_Errores = new List<string>();

            m_Errores.Add(Valor);
        }

        public string GetParametro(int Posicion)
        {
            return m_Parametro == null ? null : m_Parametro[Posicion].ToString();
        }
    
        public void ClearParametro()
        {
            m_Parametro = null;
        }

        public IList<object> Parametro
        {
            get { return m_Parametro; }
            set { m_Parametro = (List<object>) value; }
        }

        #region IDisposable Support
        // To detect redundant calls
        private bool disposedValue;

        // IDisposable
        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue) {
                if (disposing) {
                    // TODO: free unmanaged resources when explicitly called
                }

                // TODO: free shared unmanaged resources
            }

            disposedValue = true;
        }

        // This code added by Visual Basic to correctly implement the disposable pattern.
        public void Dispose()
        {
            // Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        #endregion

    }
}
